package jp.co.nes.awssupport.control.function;

import java.util.List;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.s3.model.ObjectListing;
import com.amazonaws.services.s3.model.S3ObjectSummary;

import jp.co.nes.awssupport.business.bean.CommonContainerBean;
import jp.co.nes.awssupport.business.bean.CommonContainerBean.ProcessingResult;
import jp.co.nes.awssupport.business.bean.CommonInfoBean;
import jp.co.nes.awssupport.common.base.AbstractRequestHandler;
import jp.co.nes.awssupport.common.utility.AppInfoUtil;
import jp.co.nes.awssupport.common.utility.AwsS3Helper;
import jp.co.nes.awssupport.common.utility.BeanUtil;

/**
 * データクリーンです。
 */
public class DataClean extends AbstractRequestHandler<CommonInfoBean, CommonContainerBean<CommonInfoBean>> {

    /** ロガー */
    private static Logger logger = LoggerFactory.getLogger(DataClean.class);

    /**
     * デフォルトコンストラクタです。
     */
    public DataClean() {
    }

    /*
     * (非 Javadoc)
     * @see jp.co.nes.awssupport.common.base.AbstractRequestHandler#handleRequest(java.lang.Object)
     */
    @Override
    protected CommonContainerBean<CommonInfoBean> handleRequest(CommonInfoBean input) {
        String categoryOfCi = "ContractInformation";
        String bucketNameOfCi = AppInfoUtil.getValAndEmptyChk(categoryOfCi, "BucketName");
        if (logger.isDebugEnabled()) {
            logger.debug(categoryOfCi + ",BucketName=" + bucketNameOfCi);
        }

        String categoryOfBc = "BillingCsv";
        String bucketNameOfBc = AppInfoUtil.getValAndEmptyChk(categoryOfBc, "BucketName");
        if (logger.isDebugEnabled()) {
            logger.debug(categoryOfBc + ",BucketName=" + bucketNameOfBc);
        }

        cleanS3(bucketNameOfCi, input);
        cleanS3(bucketNameOfBc, input);

        // 返却内容の設定
        CommonInfoBean info = new CommonInfoBean();
        if (input != null) {
            BeanUtil.copyProperties(info, input);
        }
        CommonContainerBean<CommonInfoBean> output = new CommonContainerBean<>();
        output.setInfoBean(info);
        output.setProcessingResult(ProcessingResult.SUCCESS);
        return output;
    }

    /**
     * s3に配置しているファイルのクリーン処理です。<br>
     * 入力情報がnull、または、処理対象年月が設定されていない場合は、指定されたバケット名配下を全て削除します。<br>
     * 入力情報に処理対象年月が設定されている場合、バケット名/処理対象年月配下を全て削除します。
     *
     * @param bucketName バケット名
     * @param input 入力情報
     */
    private void cleanS3(String bucketName, CommonInfoBean input) {
        if (logger.isDebugEnabled()) {
            logger.debug("bucketName=" + bucketName);
        }

        String targetYearMonthValue = null;
        if (input != null) {
            targetYearMonthValue = input.getTargetYearMonthValue();
        }

        AwsS3Helper helperForObjectListing = createAwsS3Helper();
        ObjectListing objectListing = null;

        if (StringUtils.isEmpty(targetYearMonthValue)) {
            objectListing = helperForObjectListing.listObjects(bucketName);
        } else {
            objectListing = helperForObjectListing.listObjects(bucketName, targetYearMonthValue);
        }
        List<S3ObjectSummary> s3ObjectSummaryList = objectListing.getObjectSummaries();
        s3ObjectSummaryList.stream().parallel().forEach(s3ObjectSummary -> {
            // parallelでs3に配置しているファイルを削除する。
            AwsS3Helper helper = createAwsS3Helper();
            helper.deleteObject(bucketName, s3ObjectSummary.getKey());
        });
    }

    /**
     * s3ヘルパーを生成します。
     *
     * @return s3ヘルパー
     */
    protected AwsS3Helper createAwsS3Helper() {
        return new AwsS3Helper();
    }
}
